#include <Arduino.h>

/*
规定主机端向本模块传输的数据必须是以下格式：
指定地址写：
    REG地址，数据……
*/

#ifndef ME4Driver_Common_H
#define ME4Driver_Common_H

enum MSD_REG_ADDR {
    ID = 0x00,  // 00H(R/-)
    CMD = 0x01, // 01H(R/W): 0x01:reset; else:apply
    //---------------------------------------------------------------
    // 模式寄存器
    // 默认状态：电机不测速，AB引脚和舵机引脚都作为输入口
    //---------------------------------------------------------------
    M0_MODE = 0x04,    /* 04H(R/W):电机工作模式(M0) */
    M1_MODE = 0x05,    /* 05H(R/W):电机工作模式(M1) */
    M2_MODE = 0x06,    /* 06H(R/W):电机工作模式(M2) */
    M3_MODE = 0x07,    /* 07H(R/W):电机工作模式(M3) */

    M0_KP = 0x0C, /*  0CH(R/W):KP (float) */
    M0_KI = 0x10, /*  10H(R/W):KI (float) */
    M0_KD = 0x14, /*  14H(R/W):KD (float) */
    M0_KR = 0x18, /*  18H(R/W):M0电机转速系数(float) */

    M1_KP = 0x1C, /*  1CH(R/W):KP (float) */
    M1_KI = 0x20, /*  20H(R/W):KI (float) */
    M1_KD = 0x24, /*  24H(R/W):KD (float) */
    M1_KR = 0x28, /*  28H(R/W):M1电机转速系数(float) */

    M2_KP = 0x2C, /*  2CH(R/W):KP (float) */
    M2_KI = 0x30, /*  30H(R/W):KI (float) */
    M2_KD = 0x34, /*  34H(R/W):KD (float) */
    M2_KR = 0x38, /*  38H(R/W):M2电机转速系数(float) */

    M3_KP = 0x3C, /*  3CH(R/W):KP (float) */
    M3_KI = 0x40, /*  40H(R/W):KI (float) */
    M3_KD = 0x44, /*  44H(R/W):KD (float) */
    M3_KR = 0x48, /*  48H(R/W):M3电机转速系数(float) */

    //---------------------------------------------------------------
    // 控制寄存器
    //---------------------------------------------------------------
    M0_SPEED = 0x4C, /* 4CH(R/W):M0电机目标转速  (int16 : -255 ~ 255) */
    M1_SPEED = 0x4E, /* 4EH(R/W):M1电机目标转速  (int16 : -255 ~ 255) */
    M2_SPEED = 0x50, /* 50H(R/W):M2电机目标转速  (int16 : -255 ~ 255) */
    M3_SPEED = 0x52, /* 52H(R/W):M3电机目标转速  (int16 : -255 ~ 255) */

    //---------------------------------------------------------------
    // 反馈寄存器
    //---------------------------------------------------------------
    M0_SPEED_RA = 0x5C, /* 5CH(R/W):M0电机实际转速 (int32:当前计数) */
    M0_SPEED_RB = 0x5E, /* 5EH(R/W):M0的AB作为IO口时，B脚的输入 */
    M1_SPEED_RA = 0x60, /* 60H(R/W):M1电机实际转速 (int32:当前计数) */
    M1_SPEED_RB = 0x62, /* 62H(R/W):M1的AB作为IO口时，B脚的输入 */
    M2_SPEED_RA = 0x64, /* 64H(R/W):M2电机实际转速 (int32:当前计数) */
    M2_SPEED_RB = 0x66, /* 66H(R/W):M2的AB作为IO口时，B脚的输入 */
    M3_SPEED_RA = 0x68, /* 68H(R/W):M3电机实际转速 (int32:当前计数) */
    M3_SPEED_RB = 0x6A, /* 6AH(R/W):M3的AB作为IO口时，B脚的输入 */

    END = 0x7B /* 最终地址 */
};

typedef struct {
    /* 电机工作模式
    s7:测速使能位
    s3:电机禁用位
    0xxx xxxx: 默认 无需测速，相应的AB引脚作为IO口
        0xxx x000: 相应的A脚作为数字输入 INPUT
        0xxx x001: 相应的A脚作为模拟输入 INPUT
        0xxx x010: 相应的A脚作为输入 INPUT_PLLDOWN
        0xxx x011: 相应的A脚作为输入 INPUT_PULLUP
        0xxx x100: 相应的A脚作为输出 OUTPUT LOW
        0xxx x101: 相应的A脚作为输出 OUTPUT HIGH
        0xxx x110: 相应的A脚作为输出 OUTPUT_OPEN_DRAIN LOW
        0xxx x111: 相应的A脚作为输出 OUTPUT_OPEN_DRAIN HIGH

        0000 xxxx: 相应的B脚作为数字输入 INPUT
        0001 xxxx: 相应的B脚作为模拟输入 INPUT
        0010 xxxx: 相应的B脚作为输入 INPUT_PLLDOWN
        0011 xxxx: 相应的B脚作为输入 INPUT_PULLUP
        0100 xxxx: 相应的B脚作为输出 OUTPUT LOW
        0101 xxxx: 相应的B脚作为输出 OUTPUT HIGH
        0110 xxxx: 相应的B脚作为输出 OUTPUT_OPEN_DRAIN LOW
        0111 xxxx: 相应的B脚作为输出 OUTPUT_OPEN_DRAIN HIGH

    1xxx xxxx: 需要测速，AB作为测速中断
        10xx xxxx: 计数不自动清零
        11xx xxxx: 转换成100ms的计数
        1xxx xxx0: 无PID控制
        11xx xxx1: 需PID控制
    */
    uint8_t mMode[4]; /* 04H~07H 电机工作模式(M0~M3) */

    uint8_t NA[4]; /* 占位  */
    
    float m0Kp; /* 0CH(R/W): KP */
    float m0Ki; /* 1009H(R/W): KI */
    float m0Kd; /* 14H(R/W): KD */
    float m0KR; /* 18H(R/W): M0电机转速系数 */

    float m1Kp; /* 1CH(R/W): KP */
    float m1Ki; /* 20H(R/W): KI */
    float m1Kd; /* 24H(R/W): KD */
    float m1KR; /* 28H(R/W): M1电机转速系数 */

    float m2Kp; /* 2CH(R/W): KP */
    float m2Ki; /* 30H(R/W): KI */
    float m2Kd; /* 34H(R/W): KD */
    float m2KR; /* 38H(R/W): M2电机转速系数 */

    float m3Kp; /* 3CH(R/W): KP */
    float m3Ki; /* 40H(R/W): KI */
    float m3Kd; /* 44H(R/W): KD */
    float m3KR; /* 48H(R/W): M3电机转速系数 */
} ME4DriverReg_MOD_t;

typedef struct {
    /* 4CH(R/W): M0电机转速 (-255 ~ 255) */
    /* 4EH(R/W): M1电机转速 (-255 ~ 255) */
    /* 50H(R/W): M2电机转速 (-255 ~ 255) */
    /* 52H(R/W): M3电机转速 (-255 ~ 255) */
    int16_t speedM[4];
} ME4DriverReg_CTL_t;

typedef struct {
    /* 5CH(R/W): M0电机实际转速 */
    /* 60H(R/W): M1电机实际转速 */
    /* 64H(R/W): M2电机实际转速 */
    /* 68H(R/W): M3电机实际转速 */
    int32_t currspeedM[4];
} ME4DriverReg_FB_t;

// 指令
enum MSD_CMD {
    INIT = 0x0E, // 00H(R/-)
    APPLY = 0x01,  // 应用：变更电机模式
};

#endif